package cn.imvc.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/*******************************************************************************
 * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换。 具体使用方法
 * compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
 */
public class CompressPic {

	/**
	 * 按指定像素压缩图片到指定路径
	 * @param file
	 * @param outputFilePath
	 * @param width
	 * @return
	 */
	public static boolean compressPic(File file, String outputFilePath, int width) {
		try {
			// 获得源文件
			if (!file.exists()) {
				return false;
			}
			Image img = ImageIO.read(file);
			// 判断图片格式是否正确
			if (img.getWidth(null) == -1) {
				return false;
			} else {
				int newWidth = img.getWidth(null);
				int newHeight = img.getHeight(null);
				BufferedImage tag;
				if(newWidth > width){
					newHeight = newHeight * width / newWidth;
					newWidth = width;
					tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
					tag.getGraphics().drawImage(img, 0, 0, newWidth, newHeight, null); // 绘制缩小后的图
					FileOutputStream out = new FileOutputStream(outputFilePath);
					// JPEGImageEncoder可适用于其他图片类型的转换
					JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
					encoder.encode(tag);
					out.close();
				} else {
					int byteread = 0;
					InputStream in = new FileInputStream(file);
					FileOutputStream out = new FileOutputStream(outputFilePath);
					byte[] buffer = new byte[1024];
					while ((byteread = in.read(buffer)) != -1) {  
		                out.write(buffer, 0, byteread);  
		            }
					out.close();
					in.close();
				}
				deleteFile(file);
				return true;
			}
		} catch (IOException ex) {
			ex.printStackTrace();
			return false;
		}
	}

	/**
	 * 删除单个文件
	 * 
	 * @param sPath
	 *            被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	public static boolean deleteFile(File file) {
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			return true;
		}
		return false;
	}
	
	public static void main(String[] args) {
		File file = new File("E://1.jpg");
		CompressPic.compressPic(file, "E://3.jpg", 700);
	}
}